Досліджуйте світ вбудованих систем з Python. Цей вичерпний посібник охоплює MicroPython, CircuitPython, інтеграцію обладнання та реальні проєкти для глобальної аудиторії.
Python на металі: глибоке занурення у вбудоване програмування та інтеграцію мікроконтролерів
Протягом десятиліть світ вбудованих систем — крихітних комп’ютерів, що живлять усе, від смарт-годинників до промислового обладнання — був виключною сферою низькорівневих мов, таких як C, C++ і Assembly. Ці мови пропонують неперевершений контроль і продуктивність, але вони мають круту криву навчання та тривалі цикли розробки. Представляємо Python, мову, відому своєю простотою, читабельністю та величезною екосистемою. Колись обмежений вебсерверами та наукою про дані, Python зараз робить потужний поштовх у серце апаратного забезпечення, демократизуючи електроніку для нового покоління розробників, любителів та новаторів у всьому світі.
Цей посібник є вашим вичерпним вступом до захопливого світу вбудованого програмування Python. Ми дослідимо, як мова високого рівня, така як Python, може безпосередньо керувати обладнанням, дослідимо ключові платформи, які роблять це можливим, і розглянемо практичні приклади, щоб допомогти вам розпочати свій шлях від програмного забезпечення до кремнію.
Екосистема вбудованого Python: більше, ніж просто CPython
Ви не можете просто встановити стандартний Python, який використовуєте на своєму ноутбуці (відомий як CPython), на типовий мікроконтролер. Ці пристрої мають надзвичайно обмежені ресурси — ми говоримо про кілобайти оперативної пам’яті та мегагерци обчислювальної потужності, що різко контрастує з гігабайтами та гігагерцами в сучасному комп’ютері. Щоб подолати цей розрив, було створено спеціалізовані, спрощені реалізації Python.
MicroPython: Python для мікроконтролерів
MicroPython — це повна переробка мови програмування Python 3, оптимізована для роботи на обмеженому обладнанні. Створений Деміеном Джорджем, він прагне бути якомога суміснішим зі стандартним Python, забезпечуючи при цьому прямий, низькорівневий доступ до обладнання.
- Ключові особливості: Він включає інтерактивний цикл Read-Eval-Print Loop (REPL), що дозволяє підключатися до плати та виконувати код рядок за рядком без етапу компіляції. Він дуже ефективний, має невеликий обсяг пам’яті та надає потужні модулі, як-от
machineдля прямого керування обладнанням (GPIO, I2C, SPI тощо). - Найкраще підходить для: Розробників, яким потрібна максимальна продуктивність, точний контроль над обладнанням і сумісність із широким спектром мікроконтролерів. Він ближчий до «металу» і часто віддається перевазі для більш критичних до продуктивності додатків.
CircuitPython: зручна для початківців потужна платформа
CircuitPython — це форк MicroPython, створений і підтримуваний Adafruit, провідною компанією в сфері електроніки «зроби сам» (DIY). Хоча він має ядро з MicroPython, його філософія зосереджена на простоті використання та освіті.
- Ключові особливості: Найбільш помітною особливістю є те, як він представляє мікроконтролер вашому комп’ютеру. Коли ви підключаєте плату CircuitPython, вона відображається як невеликий USB-накопичувач. Ви просто редагуєте свій файл
code.pyна цьому диску та зберігаєте його; плата перезавантажується та автоматично запускає ваш новий код. Він також має уніфікований API на всіх підтримуваних платах, що означає, що код для зчитування датчика на одній платі працюватиме на іншій з мінімальними змінами. - Найкраще підходить для: Початківців, викладачів і тих, хто зосереджується на швидкому створенні прототипів. Крива навчання більш полога, а велика екосистема бібліотек, надана Adafruit, робить інтеграцію датчиків, дисплеїв та інших компонентів неймовірно простою.
MicroPython vs. CircuitPython: Швидке порівняння
Вибір між ними часто зводиться до цілей вашого проєкту та рівня досвіду.
- Філософія: MicroPython надає пріоритет апаратним функціям і продуктивності. CircuitPython надає пріоритет простоті, узгодженості та легкості навчання.
- Робочий процес: За допомогою MicroPython ви зазвичай використовуєте такий інструмент, як Thonny, щоб підключитися до REPL пристрою та завантажити файли. За допомогою CircuitPython ви перетягуєте файл
code.pyна USB-накопичувач. - Підтримка обладнання: MicroPython підтримує широкий спектр плат від багатьох виробників. CircuitPython в основному підтримує плати від Adafruit і вибраних сторонніх партнерів, але його підтримка є глибокою та добре задокументованою.
- Бібліотеки: CircuitPython має величезний, кураторський набір бібліотек, які легко встановити. Бібліотеки MicroPython також доступні, але можуть бути більш фрагментованими.
У цьому посібнику концепції та багато прикладів коду будуть застосовні до обох, з незначними змінами. Ми вкажемо на відмінності там, де вони є значними.
Вибір обладнання: поле битви мікроконтролерів
Кількість мікроконтролерів (MCU), які можуть запускати Python, різко зросла за останні роки. Ось деякі з найпопулярніших і доступних варіантів для глобальної аудиторії.
Raspberry Pi Pico & RP2040
Не плутати з повноцінним комп’ютером Raspberry Pi, Pico — це недорога, високопродуктивна плата мікроконтролера, побудована на базі спеціального чипа RP2040. Він став глобальним фаворитом для Python на обладнанні.
- Ключові особливості: Потужний двоядерний процесор ARM Cortex-M0+, щедрі 264 КБ оперативної пам’яті та унікальна функція під назвою Programmable I/O (PIO), яка дозволяє створювати власні апаратні інтерфейси. Новіша модель Pico W додає вбудований Wi-Fi.
- Чому це чудово для Python: Він має офіційну, першокласну підтримку MicroPython, а також добре підтримується CircuitPython. Його низька ціна (часто менше 10 доларів США) і висока продуктивність роблять його неймовірною цінністю.
Espressif ESP32 & ESP8266
Вироблені шанхайською компанією Espressif Systems, чипи сімейства ESP є беззаперечними чемпіонами IoT. Вони відомі своїми інтегрованими можливостями Wi-Fi і Bluetooth, що робить їх вибором за замовчуванням для підключених проєктів.
- Ключові особливості: Потужні одно- або двоядерні процесори, вбудований Wi-Fi і (на ESP32) Bluetooth. Вони доступні на тисячах різних плат розробки від виробників по всьому світу.
- Чому вони чудові для Python: Чудова підтримка MicroPython дозволяє створювати підключені пристрої лише кількома рядками коду Python. Їхньої обчислювальної потужності більш ніж достатньо для складних завдань, таких як запуск вебсерверів або обробка даних з кількох датчиків.
Adafruit Feather, ItsyBitsy та екосистеми Trinket
Adafruit пропонує широкий спектр плат у стандартизованих форм-факторах. Це не конкретні чипи, а скоріше сімейства продуктів, розроблені для безперебійної роботи в екосистемі CircuitPython.
- Ключові особливості: Плати в сімействі Feather мають спільну розводку, що робить їх взаємозамінними. Багато з них включають вбудовані схеми та роз’єми для заряджання акумулятора. Вони доступні з різними мікроконтролерами, включаючи RP2040, ESP32 та інші.
- Чому вони чудові для Python: Вони розроблені з нуля для CircuitPython. Ця тісна інтеграція означає плавну, готову до використання роботу з доступом до сотень бібліотек і підручників.
Початок роботи: ваш перший "Hello, World" на обладнанні
Перейдемо від теорії до практики. Традиційний "Hello, World" вбудованого програмування — це миготіння світлодіодом. Ця проста дія підтверджує, що весь ваш інструментарій — від редактора коду до прошивки на платі — працює правильно.
Передумови
- Підтримувана плата мікроконтролера (наприклад, Raspberry Pi Pico, ESP32 або плата Adafruit).
- USB-кабель, який підтримує передачу даних (а не лише заряджання).
- Комп’ютер (Windows, macOS або Linux).
Крок 1: Встановлення прошивки
На вашій платі має бути встановлено інтерпретатор MicroPython або CircuitPython. Це називається "прошивка".
- Для CircuitPython: Відвідайте circuitpython.org, знайдіть свою плату та завантажте файл
.uf2. Переведіть плату в режим завантажувача (зазвичай це передбачає утримання кнопки "BOOT" або "RESET" під час підключення). Вона з’явиться як USB-накопичувач. Перетягніть завантажений файл.uf2на нього. Диск буде вилучено та знову з’явиться, тепер під назвою CIRCUITPY. - Для MicroPython: Відвідайте micropython.org, знайдіть свою плату та завантажте файл прошивки (часто файл
.uf2або.bin). Процес подібний: переведіть плату в режим завантажувача та скопіюйте файл.
Крок 2: Налаштування редактора
Хоча ви можете використовувати будь-який текстовий редактор, спеціалізоване IDE значно полегшує розробку. Thonny IDE настійно рекомендується для початківців. Він безкоштовний, кросплатформний і має вбудовану підтримку MicroPython і CircuitPython. Він автоматично визначає вашу плату, надає доступ до REPL пристрою та полегшує завантаження файлів.
Крок 3: Код миготіння світлодіода
Тепер перейдемо до коду. Створіть новий файл під назвою main.py для MicroPython або відредагуйте існуючий code.py для CircuitPython.
Приклад для MicroPython на Raspberry Pi Pico W:
import machine
import utime
# Вбудований світлодіод на Pico W доступний через спеціальну назву
led = machine.Pin("LED", machine.Pin.OUT)
while True:
led.toggle()
print("LED toggled!")
utime.sleep(0.5) # Зачекайте пів секунди
Приклад для CircuitPython на більшості плат Adafruit:
import board
import digitalio
import time
# Вбудований світлодіод зазвичай підключено до піна під назвою 'LED'
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = not led.value
print("LED toggled!")
time.sleep(0.5)
Розбиття коду:
import: Ми імпортуємо бібліотеки для керування обладнанням (machine,digitalio,board) і керування часом (utime,time).- Налаштування піна: Ми визначаємо, яким фізичним піном ми хочемо керувати (вбудований світлодіод) і налаштовуємо його як вихід.
- Цикл: Цикл
while True:працює вічно. Усередині циклу ми перемикаємо стан світлодіода (з увімкненого на вимкнений або з вимкненого на увімкнений), друкуємо повідомлення в послідовну консоль (видно в Thonny), а потім робимо паузу на пів секунди.
Збережіть цей файл на свій пристрій. Вбудований світлодіод повинен негайно почати блимати. Вітаємо, ви щойно запустили Python безпосередньо на мікроконтролері!
Глибше занурення: основні концепції Python на мікроконтролерах
Миготіння світлодіодом — це лише початок. Давайте дослідимо основні концепції, які ви використовуватимете для створення більш складних проєктів.
Вхід/Вихід загального призначення (GPIO)
Піни GPIO — це фізичні з’єднання, які дозволяють вашому мікроконтролеру взаємодіяти зі світом. Їх можна налаштувати як входи (для зчитування даних з кнопок або датчиків) або виходи (для керування світлодіодами, двигунами або реле).
Зчитування натискання кнопки (MicroPython):
import machine
import utime
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
while True:
if button.value() == 1:
print("Button is pressed!")
utime.sleep(0.1)
Тут ми налаштовуємо пін 14 як вхід із внутрішнім резистором підтягування вниз. Цикл безперервно перевіряє, чи значення кнопки дорівнює 1 (високий рівень), що вказує на її натискання.
Робота з датчиками
Більшість цікавих проєктів включають датчики. Python дозволяє легко зчитувати дані як з аналогових, так і з цифрових датчиків.
- Аналогові датчики: Ці датчики, як-от фоторезистори (вимірювання світла) або потенціометри, забезпечують змінну напругу. Аналого-цифровий перетворювач (АЦП) мікроконтролера зчитує цю напругу та перетворює її на число.
- Цифрові датчики: Ці більш сучасні датчики (як-от датчики температури/вологості, акселерометри) зв’язуються за допомогою певних протоколів. Двома найпоширенішими є I2C (Inter-Integrated Circuit) і SPI (Serial Peripheral Interface). Ці протоколи дозволяють кільком пристроям зв’язуватися з мікроконтролером, використовуючи лише кілька пінів. На щастя, вам рідко потрібно знати низькорівневі деталі, оскільки бібліотеки обробляють зв’язок за вас.
Зчитування температури за допомогою датчика BMP280 (CircuitPython):
import board
import adafruit_bmp280
# Створення об’єкта шини I2C
i2c = board.I2C() # Використовує піни SCL і SDA за замовчуванням
# Створення об’єкта датчика
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
# Зчитування температури
temperature = bmp280.temperature
print(f"Temperature: {temperature:.2f} C")
Широтно-імпульсна модуляція (PWM)
PWM — це техніка, яка використовується для імітації аналогового виходу на цифровому піні. Швидко вмикаючи та вимикаючи пін, ви можете керувати середньою напругою, що корисно для затемнення світлодіода, керування швидкістю двигуна постійного струму або позиціонування серводвигуна.
Підключення та Інтернет речей (IoT)
Тут плати, як-от ESP32 і Pico W, дійсно сяють. Завдяки вбудованому Wi-Fi Python надзвичайно спрощує створення пристроїв IoT.
Підключення до Wi-Fi
Підключення пристрою до мережі — це перший крок. Вам потрібно буде створити файл (часто називається secrets.py в CircuitPython), щоб безпечно зберігати облікові дані мережі.
Підключення ESP32 до Wi-Fi (MicroPython):
import network
SSID = "YourNetworkName"
PASSWORD = "YourNetworkPassword"
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(SSID, PASSWORD)
while not station.isconnected():
pass
print("Connection successful")
print(station.ifconfig())
Надсилання вебзапитів
Після підключення ви можете взаємодіяти з Інтернетом. Ви можете отримувати дані з інтерфейсів прикладного програмування (API), надсилати дані датчиків до вебсервісу або запускати онлайн-дії.
Отримання даних JSON з API (за допомогою бібліотеки `urequests`):
import urequests
response = urequests.get("http://worldtimeapi.org/api/timezone/Etc/UTC")
data = response.json()
print(f"The current UTC time is: {data['datetime']}")
response.close()
MQTT: Мова IoT
Хоча HTTP корисний, золотим стандартом для зв’язку IoT є MQTT (Message Queuing Telemetry Transport). Це легкий протокол публікації-підписки, розроблений для низькошвидкісних мереж із високою затримкою. Пристрій може "опублікувати" дані датчиків у "темі", і будь-який інший пристрій (або сервер), "підписаний" на цю тему, миттєво отримає дані. Це набагато ефективніше, ніж постійно опитувати вебсервер.
Розширені теми та найкращі практики
Зі зростанням ваших проєктів ви зіткнетеся з обмеженнями мікроконтролера. Ось кілька найкращих практик для написання надійного вбудованого коду Python.
- Керування пам’яттю: RAM — ваш найцінніший ресурс. Уникайте створення великих об’єктів, таких як списки або довгі рядки всередині циклів. Використовуйте модуль
gc(import gc; gc.collect()), щоб вручну запустити збирання сміття та звільнити пам’ять. - Керування живленням: Для пристроїв, що працюють від акумулятора, ефективність живлення має вирішальне значення. Більшість мікроконтролерів мають режим "глибокого сну", який вимикає більшість чипів, споживаючи дуже мало енергії, і може прокидатися через заданий час або від зовнішнього тригера.
- Файлова система: Ви можете читати та записувати файли у вбудовану флешпам’ять, як на звичайному комп’ютері. Це ідеально підходить для реєстрації даних або зберігання налаштувань конфігурації.
- Переривання: Замість постійної перевірки стану кнопки в циклі (процес, який називається опитуванням), ви можете використовувати переривання. Запит на переривання (IRQ) — це апаратний сигнал, який призупиняє основний код для запуску спеціальної функції, а потім відновлює його. Це набагато ефективніше та чутливіше.
Демонстрація ідей реальних проєктів
Готові будувати? Ось кілька ідей, які поєднують концепції, які ми обговорили:
- Розумна метеостанція: Використовуйте ESP32 з датчиком BME280 для вимірювання температури, вологості та тиску. Відображайте дані на невеликому OLED-екрані та публікуйте їх через MQTT на панель, як-от Adafruit IO або Home Assistant.
- Автоматизована система поливу рослин: Підключіть датчик вологості ґрунту до Raspberry Pi Pico. Коли ґрунт сухий, використовуйте пін GPIO, щоб активувати реле, яке вмикає невеликий водяний насос на кілька секунд.
- Спеціальна USB-макроклавіатура: Використовуйте плату CircuitPython, яка підтримує USB HID (Human Interface Device), як-от Pico або багато плат Adafruit. Запрограмуйте кнопки для надсилання складних комбінацій клавіш або введення попередньо визначеного тексту, підвищуючи свою продуктивність.
Висновок: майбутнє вбудоване в Python
Python докорінно змінив ландшафт вбудованої розробки. Він знизив бар’єр для входу, дозволяючи розробникам програмного забезпечення керувати обладнанням, а інженерам обладнання — створювати прототипи швидше, ніж будь-коли раніше. Простота зчитування даних з датчика або підключення до Інтернету лише кількома рядками читабельного коду змінює правила гри.
Подорож від миготіння світлодіода до повнофункціонального пристрою IoT неймовірно корисна. Глобальна спільнота та багатство бібліотек з відкритим вихідним кодом означають, що ви ніколи не будете по-справжньому самотніми, коли зіткнетеся з проблемою. Тож виберіть плату, прошийте її та почніть свою пригоду на захопливому перетині Python і фізичного світу. Єдине обмеження — ваша уява.